from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from utils.base_views import MultipleDestroyMixin
from ..models import PermissionsModel
from ..serializers import PermissionsSerializer


class PermissionsView(viewsets.ModelViewSet, MultipleDestroyMixin):
    """
    create:
    权限--新增
    status： 201（成功）， return：新增权限信息

    destroy：
    权限--删除 单个权限
    status： 204（成功）， return：None

    multiple_destroy：
    权限--批量删除 多个权限
    status： 204（成功）， return：None

    update：
    权限--修改  修改权限本身的信息（属性）
    status： 200（成功）， return：修改增权限信息

    partial_update：
    权限--修改  修改权限本身的信息（属性）
    status： 200（成功）， return：修改增权限信息

    list:
    权限--获取所有权限

    find_permissions_by_menu:
    查询属于指定菜单或者接口的权限列表，需要传参： menu_id. 比如：/find_permissions_by_menu?menu_id=2
    返回权限列表 status: 200（成功）， return：返回权限列表

    find_permissions:
    获取当前角色已经授予的权限ID列表和整个项目的所有权限列表， 必传参数： rid(角色ID)
    例如：http://127.0.0.1:8000/api/permissions/find_permissions/?rid=2
    树形权限列表信息， status：200（成功），return：权限信息列表

    retrieve:
    查询某一个指定的权限信息
    查询指定ID的权限， status：200（成功）， return：权限信息
    """
    queryset = PermissionsModel.objects.all()
    serializer_class = PermissionsSerializer
    permission_classes = [IsAuthenticated]

    @action(methods=['get'], detail=False)
    def find_permissions_by_menu(self, request, *args, **kwargs):
        menu_id = request.query_params.get('menu_id')
        permissions_list = PermissionsModel.objects.filter(menu__id=menu_id).all()
        # 序列化
        ser = PermissionsSerializer(instance=permissions_list, many=True)
        return Response(ser.data)

    @action(methods=['get'], detail=False)
    def find_permissions(self, request, *args, **kwargs):
        # 返回当前角色的所有已经拥有的权限ID列表， 以及erp系统中所有的权限（树形结构）数据
        user = request.user
        roles = user.roles.all()

        # 获取当前角色已经拥有的权限 ID 列表
        permission_ids = list(roles.values_list('permissions__id', flat=True).distinct())
        # 获取 ERP 系统中所有的权限
        all_permissions = PermissionsModel.objects.all()
        print(f"all----------------------{all_permissions}")

        # 将权限数据转换为树形结构
        permission_tree = self.build_permission_tree(all_permissions)

        # 返回结果
        return Response({
            "owned_permission_ids": permission_ids,
            "all_permissions_tree": permission_tree
        })

    def build_permission_tree(self, permissions):
        # 首先将所有权限转换为字典形式，方便查找
        permission_dict = {permission.id: {
            "id": permission.id,
            "name": permission.name,
            "is_menu": permission.is_menu,
            "method": permission.method,
            "method_display": permission.get_method_display(),
            "path": permission.path,
            "desc": permission.desc,
            "menu_id": permission.menu_id if permission.menu else None,
            "children": []
        } for permission in permissions}
        tree = []

        for permission in permissions:
            if permission.menu_id is None:
                # 顶级权限
                tree.append(permission_dict[permission.id])
            else:
                parent_id = permission.menu_id
                if parent_id in permission_dict:
                    permission_dict[parent_id]["children"].append(permission_dict[permission.id])

        return tree
